import { getProvincesList } from '../services/area';
export default {
  state: {
    list: [],
    obj: {
      username: '小白',
      age: 18,
    },
  },
  reducers: {
    // reducers 类似vuex中的mutation
    // 第一种 全量更改
    // 第二种 改里面某个属性值
    setUsername(state, { payload }) {
      const newState = { ...state };
      newState.username = payload.name;
      return newState;
    },
    setAge(state, { payload }) {
      const newState = { ...state };
      newState.age = payload.age;
      return newState;
    },
    // 第一种 全量更改
    overrideStateProps(state, { payload }) {
      return {
        ...state,
        ...payload,
        // ...{
        //   obj: { username: '小红', age: 30 },
        // },
      };
    },
    // / 第二种 改里面某个属性值
    updateStateProps(state, { payload }) {
      const { name, value } = payload;
      //   name -> state下的属性值 obj
      //   value -> state下的属性值的属性值 {username: "小黑"}
      return {
        ...state,
        // ...{
        //   obj: {
        //     ...{
        //       username: '小白',
        //       age: 18,
        //     },
        //     ...{ username: '小黑' },
        //   },
        // },
        //  [name]: state的属性值
        //  state[name]：原来state的属性值的value
        //  value 要改的state[name]的属性值
        ...{ [name]: { ...state[name], ...value } },
      };
    },
  },
  //   effects dispatch调用返回的是一个promise，可以再effect函数return 值进行接收
  effects: {
    // 类似vuex的 actions
    // getList: function* () {
    //      // 不要额外写next函数，dva自动处理执行了
    //   const res = yield getProvincesList();
    //   console.log(res);
    // },
    // effects 第一个参数是payload，第二个参数里面有内置的方法，put为去触发reducers的方法
    *getList({ payload }, { call, put, select }) {
      //  call 调用异步函数 和js中的call方法类似，可以调用参数也可以传参
      //  put：发出一个 Action，类似于 dispatch，和vuex的commit方法很类似
      //  select: 和useSelector用法类似，可以拿到所有的model的state的值
      //   const state = yield select((state) => state.user);
      // 不要额外写next函数，dva自动处理执行了
      const res = yield call(getProvincesList, 1, 2); // 请求接口
      //   put方法触发reducers修改state
      yield put({
        type: 'overrideStateProps',
        payload: {
          list: res.list,
        },
      });
      return res.list;
    },
  },
};
